home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / ccs / ccs-11tl.lha / lbl / xview / genial / func / angmes.c next >
Encoding:
C/C++ Source or Header  |  1992-07-14  |  2.9 KB  |  141 lines

  1.  
  2. /*
  3.  * angmes.c -- find the angle between two vectors (lines)
  4.  */
  5.  
  6. #include "display.h"
  7. #include "ui.h"
  8. #include "log.h"
  9. #include "reg.h"
  10. #include "common.h"
  11. #include <math.h>
  12.  
  13. ames_init()
  14. {
  15.     clear_info();
  16.     lab_info(" Please select two lines:", 1);
  17.     lab_info(" To find the angle between them, hit <eval>", 2);
  18.  
  19.     setrtype(DUBLIN);
  20.     reg_setdom(NONE);
  21.     return 0;
  22. }
  23.  
  24. ames_eval()
  25. {
  26.     static char msg[80];
  27.     XPoint    p1, p2, p3, p4;
  28.     double    angle, compute_angle();
  29.     struct dlist *dl;
  30.  
  31.     if (curfunc->reg->r_plen != 4) {
  32.     fprintf(stderr, "Error: 2 lines not yet selected. (%d) \n",
  33.         curfunc->reg->r_plen);
  34.     XBell(display, 0);
  35.     return -1;
  36.     }
  37.     dl = curfunc->reg->r_dlist;
  38.     if (dl == NULL)
  39.     return -1;
  40.  
  41.     p1.x = dl->points[0].pt.x;
  42.     p1.y = dl->points[0].pt.y;
  43.     p2.x = dl->points[dl->len - 1].pt.x;
  44.     p2.y = dl->points[dl->len - 1].pt.y;
  45.  
  46.     dl = dl->next;
  47.     if (dl == NULL)
  48.     return -1;
  49.  
  50.     p3.x = dl->points[0].pt.x;
  51.     p3.y = dl->points[0].pt.y;
  52.     p4.x = dl->points[dl->len - 1].pt.x;
  53.     p4.y = dl->points[dl->len - 1].pt.y;
  54.  
  55.     angle = compute_angle(p1, p2, p3, p4);
  56.  
  57.     sprintf(msg, "Angle between lines: %.2f radians ; %.2f degrees",
  58.         (float) angle, (float) angle * (180 / M_PI));
  59.  
  60.     xv_set(base_win->infomesg, PANEL_LABEL_STRING, msg, NULL);
  61.     panel_paint(base_win->infomesg, PANEL_CLEAR);
  62.  
  63.     return 0;
  64. }
  65.  
  66. /***********************************************************/
  67. double
  68. compute_angle(p1, p2, p3, p4)    /* returns the angle in radians between 2
  69.                  * lines defined by these 4 points */
  70.     XPoint    p1, p2, p3, p4;
  71. {
  72.     struct vect {
  73.     float     x, y;
  74.     };
  75.  
  76.     struct vect vec1, vec2;    /* two lines in vector form */
  77.     double    angle, mag1, mag2;
  78.  
  79.     vec1.x = p2.x - p1.x;
  80.     vec1.y = p2.y - p1.y;
  81.  
  82.     vec2.x = p4.x - p3.x;
  83.     vec2.y = p4.y - p3.y;
  84.  
  85.     mag1 = sqrt((double) ((vec1.x * vec1.x) + (vec1.y * vec1.y)));
  86.     mag2 = sqrt((double) ((vec2.x * vec2.x) + (vec2.y * vec2.y)));
  87.  
  88.     /* normalize vector */
  89.     vec1.x /= mag1;
  90.     vec1.y /= mag1;
  91.     vec2.x /= mag2;
  92.     vec2.y /= mag2;
  93.  
  94. #define ANGLE_0-90 
  95. #ifdef ANGLE_0-90
  96.     /* force angle to be between 0 and 90 degrees */
  97.     angle = fabs(vec1.x * vec2.x + vec1.y * vec2.y);
  98.     if (angle > 1.0)
  99.        angle = 1.0;
  100.     angle = acos(angle);
  101. #else
  102.     /* force angle to be between 0 and 180 degrees */
  103.     /* this doesnt work!! */
  104.     angle = (vec1.x * vec2.x + vec1.y * vec2.y);
  105.     if (angle > 1.0)
  106.        angle = 1.0;
  107.     if (angle < -1.0)
  108.        angle = -1.0;
  109.     if (angle > M_PI)
  110.        angle -= M_PI;
  111.     if (angle < 0.0)
  112.        angle += M_PI;
  113. #endif
  114.     return (angle);
  115. }
  116.  
  117. /*************************************************************/
  118.  
  119. ames_change()
  120. {
  121.  
  122.     printf("ames_change: not yet implemented. \n");
  123.  
  124. }
  125.  
  126. /*************************************************************/
  127.  
  128. ames_clear()
  129. {
  130.     clear_info();
  131.  
  132.     return 0;
  133. }
  134.  
  135. ames_reset()
  136. {
  137.     xv_set(base_win->eval,
  138.        PANEL_INACTIVE, FALSE,
  139.        NULL);
  140. }
  141.